package com.campus.secondhand.service;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.campus.secondhand.common.Result;
import com.campus.secondhand.model.vo.ProductListVO;
import com.campus.secondhand.model.vo.PurchaseRequestVO;

/**
 * 收藏服务接口
 */
public interface FavoriteService {

    /**
     * 判断用户是否已收藏商品
     * 
     * @param userId    用户ID
     * @param productId 商品ID
     * @return 是否已收藏
     */
    Boolean isFavorite(Long userId, Long productId);

    /**
     * 判断用户是否已收藏求购信息
     * 
     * @param userId            用户ID
     * @param purchaseRequestId 求购信息ID
     * @return 是否已收藏
     */
    Boolean isPurchaseRequestFavorite(Long userId, Long purchaseRequestId);

    /**
     * 获取商品的收藏数量
     * 
     * @param productId 商品ID
     * @return 收藏数量
     */
    Integer countProductFavorites(Long productId);

    /**
     * 获取求购信息的收藏数量
     * 
     * @param purchaseRequestId 求购信息ID
     * @return 收藏数量
     */
    Integer countPurchaseRequestFavorites(Long purchaseRequestId);

    /**
     * 添加商品收藏
     * 
     * @param userId    用户ID
     * @param productId 商品ID
     * @return 操作结果
     */
    Result<Void> addFavorite(Long userId, Long productId);

    /**
     * 添加求购信息收藏
     * 
     * @param userId            用户ID
     * @param purchaseRequestId 求购信息ID
     * @return 操作结果
     */
    Result<Void> addPurchaseRequestFavorite(Long userId, Long purchaseRequestId);

    /**
     * 取消商品收藏
     * 
     * @param userId    用户ID
     * @param productId 商品ID
     * @return 操作结果
     */
    Result<Void> removeFavorite(Long userId, Long productId);

    /**
     * 取消求购信息收藏
     * 
     * @param userId            用户ID
     * @param purchaseRequestId 求购信息ID
     * @return 操作结果
     */
    Result<Void> removePurchaseRequestFavorite(Long userId, Long purchaseRequestId);

    /**
     * 获取用户的收藏商品列表
     * 
     * @param userId   用户ID
     * @param pageable 分页参数
     * @return 收藏的商品列表
     */
    Result<Page<ProductListVO>> getUserFavorites(Long userId, Pageable pageable);

    /**
     * 获取用户的收藏求购信息列表
     * 
     * @param userId   用户ID
     * @param pageable 分页参数
     * @return 收藏的求购信息列表
     */
    Result<Page<PurchaseRequestVO>> getUserFavoritePurchaseRequests(Long userId, Pageable pageable);
}